//*******************************************************************
// библиотека для работы с контроллером клавиатуры max7370 через
// интерфейс I2C

// для работы с библитекой необходимо вызвать функцию 
// void initKeyboard(void) которая инициализирует порты и запустит поток опроса клавиатуры
// после этого в программе можно вызывать функцию
// enum KeyStroke waitKeyStroke(void); которая блокирует в ожидании вызвавщий её поток до 
// нажатия на клавишу, после чего возвращает код нажатой клавиши

// Примечание:
// - для правильной работы частота контроллера должна составлять 168 МГц
// - частота i2c 100 кГц
// - после инициализации в буфере могут находится предыдущие нажатия клавиш 

//*******************************************************************
#include "cmsis_os.h"
#include "GPIO_STM32F4xx.h"  


// **** управление битами***********************************
#define MSET_BIT0 |=0x01
#define MSET_BIT1 |=0x02
#define MSET_BIT2 |=0x04
#define MSET_BIT3 |=0x08
#define MSET_BIT4 |=0x10
#define MSET_BIT5 |=0x20
#define MSET_BIT6 |=0x40
#define MSET_BIT7 |=0x80
#define MSET_BIT8 |=0x100
#define MSET_BIT9 |=0x200
#define MSET_BIT10 |=0x400
#define MSET_BIT11 |=0x800
#define MSET_BIT12 |=0x1000
#define MSET_BIT13 |=0x2000
#define MSET_BIT14 |=0x4000
#define MSET_BIT15 |=0x8000
#define MSET_BIT16 |=0x10000
#define MSET_BIT17 |=0x20000
#define MSET_BIT18 |=0x40000
#define MSET_BIT19 |=0x80000
#define MSET_BIT20 |=0x100000
#define MSET_BIT21 |=0x200000
#define MSET_BIT22 |=0x400000
#define MSET_BIT23 |=0x800000
#define MSET_BIT24 |=0x1000000
#define MSET_BIT25 |=0x2000000
#define MSET_BIT26 |=0x4000000
#define MSET_BIT27 |=0x8000000
#define MSET_BIT28 |=0x10000000
#define MSET_BIT29 |=0x20000000
#define MSET_BIT30 |=0x40000000
#define MSET_BIT31 |=0x80000000

#define MRSET_BIT0 &=~0x01
#define MRSET_BIT1 &=~0x02
#define MRSET_BIT2 &=~0x04
#define MRSET_BIT3 &=~0x08
#define MRSET_BIT4 &=~0x10
#define MRSET_BIT5 &=~0x20
#define MRSET_BIT6 &=~0x40
#define MRSET_BIT7 &=~0x80
#define MRSET_BIT8 &=~0x100
#define MRSET_BIT9 &=~0x200
#define MRSET_BIT10 &=~0x400
#define MRSET_BIT11 &=~0x800
#define MRSET_BIT12 &=~0x1000
#define MRSET_BIT13 &=~0x2000
#define MRSET_BIT14 &=~0x4000
#define MRSET_BIT15 &=~0x8000
#define MRSET_BIT16 &=~0x10000
#define MRSET_BIT17 &=~0x20000
#define MRSET_BIT18 &=~0x40000
#define MRSET_BIT19 &=~0x80000
#define MRSET_BIT20 &=~0x100000
#define MRSET_BIT21 &=~0x200000
#define MRSET_BIT22 &=~0x400000
#define MRSET_BIT23 &=~0x800000
#define MRSET_BIT24 &=~0x1000000
#define MRSET_BIT25 &=~0x2000000
#define MRSET_BIT26 &=~0x4000000
#define MRSET_BIT27 &=~0x8000000
#define MRSET_BIT28 &=~0x10000000
#define MRSET_BIT29 &=~0x20000000
#define MRSET_BIT30 &=~0x40000000
#define MRSET_BIT31 &=~0x80000000
//***********************************************************

#define PERIOD_SCAN_KEYBOARD  50  // перериод через который произволиться опрос контроллера клавиотуры в ms

#define PORT_INT_KEY GPIOB				// порт прерывания нажатия клавиши
#define PIN_INT_KEY	1							// пин прерывания нажатия клавиши


// type:
enum KeyStroke {F1=3,F2=11,F3=19,Start=4,Up=12,Stop=20,Left=5,Enter=13,Right=21,Plus=6,Down=14,Minus=22,Menu=7,C=15,Esc=23,NotKeyPress=0}; // коды нажатых клавиш

//global value:
extern osThreadId threadKeyboard_id;			// id потока обработки клавиатуры
extern enum KeyStroke KeyPress;					// код нажатой клавиши

// publict:
/**
  \fn          void initKeyboard(void)
  \brief       Initializes the controller keyboard
*/void initKeyboard(void); // инициализа контроллера клавиатуры
/**
  \fn          enum KeyStroke waitKeyStroke(void)
  \brief       Waiting function key is pressed. Returns the code of the key pressed.
*/
enum KeyStroke waitKeyStroke(void); // ожидание нажатия клавиши. Возвращает код нажатой клавиши.

void threadKeyboard(void const *argument); // поток обработки данных с клавиатуры


// private:
void initI2C2(void); // инициализация порта I2C
void initPortInt(void); // инициализация порта прерывания от клавиатуры
void initMAX7370(void); // настройка микросхемы
enum KeyStroke readKodKeyPress(void); // чтение кода нажатой клавиши по i2c2
